package com.qiongqi.datadir.service;

import com.qiongqi.datadir.domain.BucketData;
import com.qiongqi.datadir.domain.BucketQuota;
import io.minio.StatObjectResponse;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public interface IMinioService {
    /**
     * 创建 Bucket（默认无配额）
     * @param bucketName
     * @return
     */
    boolean createBucket(String bucketName);

    /**
     * 创建 Bucket 并设置配额（单位：字节）
     * @param bucketName
     * @param quotaBytes
     * @return
     */
    boolean createBucketWithQuota(String bucketName, long quotaBytes);

    /**
     * 创建 Bucket 并设置配额（单位：字节）
     * @param bucketQuota
     * @return
     */
    boolean createBucketWithQuota(BucketQuota bucketQuota);

    /**
     * 设置现有 Bucket 的配额
     * @param bucketName
     * @param quotaBytes
     * @return
     */
    boolean setBucketQuota(String bucketName, long quotaBytes);

    /**
     * 获取 Bucket 配额信息
     * @param bucketName
     * @return
     */
    Optional<BucketQuota> getBucketQuota(String bucketName);
    /**
     * 上传文件（带配额检查）
     * @param bucketName
     * @param bucketData
     * @param stream
     * @param size
     * @param contentType
     * @throws Exception
     */
    int putObject(String bucketName, BucketData bucketData, InputStream stream, long size, String contentType) throws Exception;

    /**
     * 删除对象（更新大小）
     * @param bucketName
     * @param objectName
     * @throws Exception
     */
    void removeObject(String bucketName, String objectName) throws Exception;

    /**
     * 获取所有 Buckets（带配额信息）
     * @return
     */
    List<Map<String, Object>> getAllBucketsWithInfo();

    /**
     * 获取所有 Buckets（不带配额信息）
     * @return
     */
    List<Bucket> getAllBuckets();

    /**
     * 根据名称获取桶信息
     * @param bucketName
     * @return
     */
    Optional<Bucket> getBucket(String bucketName);

    /**
     * 根据名称删除桶
     * @param bucketName
     */
    void removeBucket(String bucketName);

    /**
     * 根据桶名与对象前缀获取对象列表
     * @param bucketName
     * @param prefix
     * @param recursive
     * @return
     */
    List<Item> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive);

    /**
     * 获取对象URL
     * @param bucketName
     * @param objectName
     * @param expires
     * @param method
     * @param reqParams
     * @return
     */
    String getObjectURL(String bucketName, String objectName, Integer expires, Method method, Map<String, String> reqParams);

    /**
     * 根据桶名称和对象名称获取存储对象
     * @param bucketName
     * @param objectName
     * @return
     */
    InputStream getObject(String bucketName, String objectName);

    /**
     * 根据桶名称和对象名称获取对象信息
     * @param bucketName
     * @param objectName
     * @return
     * @throws Exception
     */
    StatObjectResponse getObjectInfo(String bucketName, String objectName) throws Exception;

    /**
     * 简化上传（自动获取对象大小）
     * @param bucketName
     * @param bucketData
     * @param inputFile
     * @throws Exception
     */
    int putObject(String bucketName, BucketData bucketData, File inputFile) throws Exception;

    /**
     * 获取所有 Buckets（过期的）
     * @return
     */
    List<BucketQuota> getAllExpiredBuckets();

    /**
     * 清空与删除桶
     * @param bucketName
     * @return
     */
    boolean removeBucketByName(String bucketName);
}
